home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WW3DKit / WWSet.m < prev    next >
Encoding:
Text File  |  1995-03-22  |  7.2 KB  |  321 lines

  1.  
  2. #import "WWSet.h"
  3. #import "WWInterp.h"
  4.  
  5. @implementation WWSet
  6.  
  7. + initialize { return [WWSet setVersion:1], self; }
  8.  
  9.  
  10. - init
  11. {
  12.   [super init];
  13.   var = NULL;
  14.   value = NULL;
  15.   cmd = NULL;
  16.   interp = nil;
  17.  
  18.   return self;
  19. }
  20.  
  21. - initWithInterp:myInterp
  22. {
  23.   [super init];
  24.   var = NULL;
  25.   value = NULL;
  26.   cmd = NULL;
  27.   interp = myInterp;
  28.  
  29.   return self;
  30. }
  31.  
  32. - free
  33. {
  34.   if (var)
  35.   {  free(var);
  36.   }
  37.   if (value)
  38.   {  free(value);
  39.   }
  40.   if (cmd)
  41.   {  free(cmd);
  42.   }
  43.  
  44.   return [super free];
  45. }
  46.  
  47. // this is used only internally, for setting a copy without freeing the original
  48. - _setVar:(const char *)newVar value:(const char *)newValue
  49. {
  50.   if (newVar)
  51.   {  var = NXCopyStringBuffer(newVar);
  52.   }
  53.   else
  54.   {  var = NULL;
  55.   }
  56.  
  57.   if (newValue)
  58.   {  value = NXCopyStringBuffer(newValue);
  59.   }
  60.   else
  61.   {  value = NULL;
  62.   }
  63.  
  64.   if (var && value)
  65.   {  // cmd == "wwSet \"%s\" \"%s\""; i.e. 12 + strlen(var) + strlen(value)
  66.      cmd = (char *)malloc(12 + strlen(var) + strlen(value));
  67.      if (!cmd)
  68.      {  NXLogError("WWSet: couldn't malloc memory for cmd!");
  69.         return nil;
  70.      }
  71.      sprintf(cmd, "wwSet \"%s\" \"%s\"", var, value);
  72.   }
  73.   else
  74.   {  NXLogError("WWSet: need to hand in non-NULL values for both var and value!");
  75.      return nil;
  76.   }
  77.   return self;
  78. }
  79.  
  80. - copyFromZone:(NXZone *)zone
  81. {
  82.    id   newCopy = [super copyFromZone:zone];
  83.  
  84.   [newCopy _setVar:var value:value];
  85.   return newCopy;
  86. }
  87.  
  88. - setVar:(const char *)newVar value:(const char *)newValue
  89. {
  90.   if (var)
  91.   {  free(var);
  92.   }
  93.   if (newVar)
  94.   {  var = NXCopyStringBuffer(newVar);
  95.   }
  96.   else
  97.   {  var = NULL;
  98.   }
  99.  
  100.   if (value)
  101.   {  free(value);
  102.   }
  103.   if (newValue)
  104.   {  value = NXCopyStringBuffer(newValue);
  105.   }
  106.   else
  107.   {  value = NULL;
  108.   }
  109.  
  110.   if (cmd)
  111.   {  free(cmd);
  112.   }
  113.   if (var && value)
  114.   {  // cmd == "wwSet \"%s\" \"%s\""; i.e. 12 + strlen(var) + strlen(value)
  115.      cmd = (char *)malloc(12 + strlen(var) + strlen(value));
  116.      if (!cmd)
  117.      {  NXLogError("WWSet: couldn't malloc memory for cmd!");
  118.         return nil;
  119.      }
  120.      sprintf(cmd, "wwSet \"%s\" \"%s\"", var, value);
  121.   }
  122.   else
  123.   {  NXLogError("WWSet: need to hand in non-NULL values for both var and value!");
  124.      return nil;
  125.   }
  126.   return self;
  127. }
  128.  
  129. - (const char *)var { return (const char *)var; }
  130. - (const char *)value { return (const char *)value; }
  131. - (const char *)cmd { return (const char *)cmd; }
  132.  
  133.  
  134.  
  135. // WWRenderable protocol conformance stuff
  136.  
  137. - (BOOL)pushesOrPopsCTM { return NO; }
  138. - (BOOL)pushesCTM { return NO; }
  139. - (BOOL)popsCTM { return NO; }
  140. - (BOOL)hasBoundingBox { return NO; }
  141. - (RtBound *)boundingBoxStartingAt:(RtFloat)intervalStartTime endingAt:(RtFloat)intervalEndTime { return NULL; }
  142. - calculateBoundingBoxStartingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime { return self; }
  143. - setBoundingBox:(RtBound *)newBoundingBox { return nil; }
  144. - renderMaps:(WW3DCamera *)camera startingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime usingStream:(NXStream *)ns { return self; } 
  145. - renderMaps:(WW3DCamera *)camera usingStream:(NXStream *)ns { return self; }
  146. - renderMaps:(WW3DCamera *)camera startingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime { return self; } 
  147. - renderMaps:(WW3DCamera *)camera { return self; } 
  148. - renderSelfAsBox:(WW3DCamera *)camera startingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime { return self; } 
  149. - preRenderSelf:(WW3DCamera *)camera startingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime { return self; }
  150. - preRenderSelf:(WW3DCamera *)camera { return self; }
  151.  
  152. - renderSelf:(WW3DCamera *)camera  startingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime
  153. {
  154.   if (NXDrawingStatus != NX_DRAWING)
  155.   {  RiArchiveRecord("comment", cmd); 
  156.   }
  157.   else
  158.   {  [interp globalEval:cmd];
  159.   }
  160.   
  161.   return self;
  162. }
  163.  
  164. - renderSelf:(WW3DCamera *)camera
  165. {
  166.   RtFloat  shutterOpenTime = [camera shutterOpenTime],
  167.            shutterCloseTime = [camera shutterCloseTime];
  168.  
  169.  
  170.   return [self renderSelf:camera startingAt:shutterOpenTime endingAt:shutterCloseTime];
  171. }
  172.  
  173. - transformCTM:(WW3DAttributeState *)attributeState startingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime { return self; }
  174. - (BOOL)isMotionBlurrable { return NO; }
  175. - (BOOL)isCompoundCommand { return NO; }
  176. - (float)lastSampleIsAt { return 0.0; }
  177. - (BOOL)isLerpable { return NO; }
  178. - lerpWith:b by:(float)uValue { return nil; }
  179. - lerpSelfWith:b by:(float)uValue { return nil; }
  180. - (unsigned long int)maxSampleBandwidth 
  181. {  if (cmd)
  182.    {  return (unsigned long int)strlen(cmd);
  183.    }
  184.    return 0;
  185. }
  186.  
  187. - writeEve:(NXStream *)stream atTabLevel:(int)tab
  188. {
  189.    int  i;
  190.  
  191.  
  192.    for (i = 0; i < tab; i++)
  193.    {  NXPrintf(stream, "\t");
  194.    }
  195.    NXPrintf(stream, "%s;", cmd); 
  196.    return self;
  197. }
  198.  
  199. - writeScene:(NXStream *)stream atTabLevel:(int)tab
  200. {
  201.    return [self writeEve:stream atTabLevel:tab];
  202. }
  203.  
  204.  
  205. - write3DTextScene:(NXStream *)stream atTabLevel:(int)tab index:(int)index time:(float)time until:(float)lastTime
  206. {
  207.    int  i;
  208.  
  209.  
  210.    for (i = 0; i < tab; i++)
  211.    {  NXPrintf(stream, "\t");
  212.    }
  213.  
  214.    NXPrintf(stream, "set __text__(color%s) {1 1 1}\n", [[self class] name]);
  215.    NXPrintf(stream, "startShape %s; EveCmd {Color $__text__(color%s)}; ", [[self class] name], [[self class] name]);
  216.    // need tab
  217.    // need index (position in current list)
  218.    NXPrintf(stream, 
  219.         "EveCmd {Translate [expr { %d * $__text__(tabLength)}] [expr {$__text__(spacingFactor) * %d * $__text__(spacing) * $__text__(fontSize)}] 0 };\n", 
  220.             tab, index); 
  221.    for (i = 0; i < tab; i++)
  222.    {  NXPrintf(stream, "\t");
  223.    }
  224.    NXPrintf(stream, "  EveCmd {WW3DText $__text__(fontName) $__text__(fontSize) {");
  225.    [self writeEve:stream atTabLevel:tab];
  226.    NXPrintf(stream, "} left;}\n");
  227.   NXPrintf(stream, "endShape;\n");
  228.  
  229.   return self;
  230. }
  231.  
  232.  
  233. - writeInventorAtTime:(float)currentTime to:(NXStream *)stream atTabLevel:(int)tab
  234. {
  235.    int  i;
  236.  
  237.  
  238.    for (i = 0; i < tab; i++)
  239.    {  NXPrintf(stream, "\t");
  240.    }
  241.    NXPrintf(stream, "# ");
  242.    [self writeEve:stream atTabLevel:tab];
  243.    NXPrintf(stream, "\n");
  244.  
  245.    return self;
  246. }
  247.  
  248. - (BOOL)theSameAs:otherRIBCommand
  249. {
  250.   if ([self class] != [otherRIBCommand class])
  251.   {  return NO;
  252.   }
  253.  
  254.   if (var)
  255.   {  if (![otherRIBCommand var])
  256.      {  return NO;
  257.      }
  258.      if (strcmp(var, [otherRIBCommand var]))
  259.      {  return NO;
  260.      }
  261.   }
  262.   if (value)
  263.   {  if (![otherRIBCommand value])
  264.      {  return NO;
  265.      }
  266.      if (strcmp(value, [otherRIBCommand value]))
  267.      {  return NO;
  268.      }
  269.   }
  270.   return YES;
  271. }
  272.  
  273.  
  274. - (BOOL)similarTo:otherRIBCommand 
  275. {
  276.   if ([self class] != [otherRIBCommand class])
  277.   {  return NO;
  278.   }
  279.   return YES;
  280. }
  281.  
  282.  
  283. - (BOOL)isMoot { return NO;}
  284.  
  285. - (BOOL)isMootStartingAt:(float)startTime endingAt:(float)endTime  {  return [self isMoot];  }
  286.  
  287.  
  288.  
  289. #define typeVector "***"
  290. #define typeValues &var, &value, &cmd
  291.  
  292. - read:(NXTypedStream*)stream 
  293. {
  294.     int version;
  295.     [super read:stream];
  296.  
  297.     version = NXTypedStreamClassVersion(stream, "WWSet");
  298.     if (version == 0) NXReadTypes(stream, "i", &version), version=1;
  299.     if (version == 1)
  300.     {  NXReadTypes(stream, typeVector, typeValues);
  301.     } 
  302.     else 
  303.     {
  304.     }
  305.     return self;
  306. }
  307.  
  308. - write:(NXTypedStream*)stream 
  309. {
  310.     [super write:stream];
  311.  
  312.     NXWriteTypes(stream, typeVector, typeValues);
  313.  
  314.     return self;
  315. }
  316.  
  317. // boy, this is dumb... This is to get around the stupid warnings from the compiler - ask wave for details
  318. - class { return [super class]; }
  319.  
  320. @end
  321.